844. 比较含退格的字符串

844. 比较含退格的字符串

分析

因为存在退格,因此无法通过顺序对比字符来比较两个字符串,因为你刚发现字符不一致,下一个就是退格符,得考虑退格符再比较。
因此思路就很简单了,要首先用一个方法把字符串中的退格操作做完拿到最终的字符串,再进行比较

解题

一开始是这么想的,既然退格符是向左删除,那我们从从右向左比较,遇到 # 就向左跳两个位置即可 ,但是后面发现不行,因为可能连续存在多个 ##,连续两个 ## 的话,第二个 # 就被跳过去了,还是只能从左到右,严格按照 # 的定义来,遇到 # 就会退一个,因此

public boolean backspaceCompare(String s, String t) {
    // 先获取最原始的字符串,
    char[] sArray = getRawStr(s);
    char[] tArray = getRawStr(t);
    if(sArray.length!=tArray.length){
        return false;
    }
    for(int i=0;i<sArray.length;i++){
        if(sArray[i]!=tArray[i]){
            return false;
        }
    }
    return true;
}

public char[] getRawStr(String t){
    char[] tArray = t.toCharArray();
    int slow=0,fast=0;
    for(;fast<tArray.length;fast++){
        if(tArray[fast]=='#'){
            // 通过移动慢指针实现删除元素
            // 注意可能会删到小于0,因此slow如果已经是0了,就不要再删了
            if(slow>0){
                slow--;
            }
        }else{
            tArray[slow] = tArray[fast];
            slow++;
        }
    }
    char[] target = new char[slow];
    for(int i=0;i<target.length;i++){
        target[i] = tArray[i];
    }
    return target;
}

相关题

27. 移除元素
26. 删除有序数组中的重复项
283. 移动零
977. 有序数组的平方
滑动窗口
209. 长度最小的子数组
904. 水果成篮